package org.fixies.database;

import org.fixies.resource.Initializer;
import org.fixies.utils.Validator;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;

import javax.naming.NamingException;
import javax.sql.DataSource;


public class MockJndiDataSourceRegister implements Initializer {

    /**
     * データソース
     */
    private DataSource ds_;
    /**
     * データソース名
     */
    private String jndiName_;

    /**
     * デフォルトコンストラクタ
     */
    public MockJndiDataSourceRegister() {
    }

    public MockJndiDataSourceRegister(DataSource ds, String jndiName) {
        super();
        ds_ = ds;
        jndiName_ = jndiName;
    }

    /**
     * @param ds 設定する ds_。
     */
    public void setDataSource(DataSource ds) {
        ds_ = ds;
    }

    /**
     * @param jndiName_ 設定する name_。
     */
    public void setName(String jndiName) {
        jndiName_ = jndiName;
    }


    public void initialize() throws IllegalStateException, NamingException {
        Validator.notNullOrEmpty(jndiName_);
        Validator.notNull(ds_);
        bind(jndiName_, ds_);
    }

    public void terminate() {
        SimpleNamingContextBuilder.getCurrentContextBuilder().clear();
    }

    /**
     * オブジェクトのバインドを行う。
     *
     * @param name JNDI名
     * @param obj  オブジェクト
     * @throws IllegalStateException 予期しない例外
     * @throws NamingException       予期しない例外
     */
    private void bind(String name, Object obj)
            throws IllegalStateException, NamingException {
        SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
        builder.bind(name, obj);
    }
}
